home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / cuj0696.zip / DWYER.ZIP / FREQ.TST / EXCHISQ.C < prev    next >
C/C++ Source or Header  |  1996-01-07  |  3KB  |  101 lines

  1.  /* ============ */
  2. /* exchisq.c    */
  3. /* ============ */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <mconf.h>
  7. #include <math.h>
  8. #include <miscdefs.h>
  9. #include <freqdefs.h>
  10.  
  11. #define    NUM_PROBS    100
  12. #define LOW_PROB    1.0e-8
  13.  
  14. /* ==================================================================== */
  15. /* ExecChiSqTest - Executes Chi-Square Test For Frequency Test        */
  16. /* ==================================================================== */
  17. void
  18. ExecChiSqTest(CHISQ_STRU * ChiSqData)
  19. {
  20.     int     k;
  21.     double  ChiSqProbs[NUM_PROBS];
  22.     double  DegFree, LoLimit, HiLimit;
  23.     double  KnMinusStat, KnMinusProb, KnPlusStat,  KnPlusProb;
  24.  
  25.     /* -------------------------------- */
  26.     /* Get Control Parameters From User */
  27.     /* -------------------------------- */
  28.     SetChiSqControls(ChiSqData);
  29.     fprintf(stderr, "\n"); fflush(NULL);
  30.  
  31.     /* ------------------------ */
  32.     /* Initialize Variate Count */
  33.     /* ------------------------ */
  34.     ChiSqData->TotNumGen = 0;
  35.  
  36.     /* ------------------------- */
  37.     /* Generate Random Numbers,  */
  38.     /* Calculate Chi-Square Data */
  39.     /* ------------------------- */
  40.     DegFree = ChiSqData->NumElements - 1;
  41.     ChiSqDist(LOW_PROB, DegFree, &LoLimit, &HiLimit);
  42.  
  43.  
  44.     for (k = 0; k < NUM_PROBS; ++k)
  45.     {
  46.     /* ------------------------------ */
  47.     /* Calculate Chi-Square Statistic */
  48.     /* ------------------------------ */
  49.     ChiSqFreq(ChiSqData);
  50.  
  51.     fprintf(stderr, "\rPass %3d (of %d), %8ld  Total Random Numbers",
  52.         k+1, NUM_PROBS, ChiSqData->TotNumGen);
  53.  
  54.     /* -------------------------------- */
  55.     /* Calculate Chi-Square Probability */
  56.     /* -------------------------------- */
  57.     if (ChiSqData->ChiSqValu < LoLimit)
  58.     {
  59.           ChiSqProbs[k] = LOW_PROB;
  60.     }
  61.     else if (ChiSqData->ChiSqValu > HiLimit)
  62.     {
  63.           ChiSqProbs[k] = 1.0 - LOW_PROB;
  64.     }
  65.     else
  66.     {
  67.         ChiSqProbs[k] = chdtr(DegFree, ChiSqData->ChiSqValu);
  68.     }
  69.  
  70.     P(printf("Chi-Square Value Calculated from %7lu Variates  = %f\n",
  71.         ChiSqData->NumVariates, ChiSqData->ChiSqValu));
  72.     P(printf("Chi-Square Probability on %5u Degrees of Freedom = %f\n",
  73.         ChiSqData->NumElements-1, ChiSqProbs[k]));
  74.     P(fprintf(stderr, "\r%3d of %d", k+1, NUM_PROBS));
  75.  
  76.     if (ChiSqProbs[k] < 0)
  77.     {
  78.         fprintf(stderr, "\nChiSqFreq(): Function chdtr() "
  79.         "Returned Negative Probability -  Can't Happen.\n");
  80.         P(printf("ChiSqFreq: MaxSize    = %lu\n",
  81.         ChiSqData->NumElements));
  82.     }
  83.     }
  84.     fprintf(stderr, "\n"); fflush(NULL);
  85.  
  86.     KSCalc(ChiSqProbs, NUM_PROBS, &KnPlusStat, &KnPlusProb,
  87.     &KnMinusStat, &KnMinusProb);
  88.  
  89.     printf("\nKolmogorov-Smirnov Statistics and Probabilities"
  90.        " on Chi-Square Data\n");
  91.  
  92.     printf("\tK(%d)+ = %f (Knuth) or %9f%%\n", NUM_PROBS,
  93.     sqrt((double)NUM_PROBS)*KnPlusStat, 100*KnPlusProb);
  94.  
  95.     printf("\tK(%d)+ = %f (Knuth) or %9f%%\n", NUM_PROBS,
  96.     sqrt((double)NUM_PROBS)*KnMinusStat, 100*KnMinusProb);
  97.  
  98.     printf("\nThis Run Required %ld Random Numbers\n\n",
  99.     ChiSqData->TotNumGen);
  100. }
  101.